import json  # Импорт модуля для работы с JSON данными
import psycopg2  # Импорт модуля для работы с PostgreSQL базой данных
from psycopg2.extras import Json  # Импорт Json-адаптера для psycopg2, который позволяет работать с JSON данными в PostgreSQL
from datetime import datetime, timezone
from configparser import ConfigParser  # Импорт модуля для работы с конфигурационными файлами
from datetime import datetime, timedelta  # Импорт модуля для работы с датами и временем
from tqdm import tqdm  # Импорт модуля для создания индикатора выполнения прогресса
from dateutil.relativedelta import relativedelta  # Импорт класса для работы с относительной датой и временем
import os  # Импорт модуля для работы с операционной системой
import socket
import pandas as pd

# Initialize the ConfigParser and read the config file
config = ConfigParser()
config.read("config.ini")

DBNAME = config.get("DATABASE", "DATABASE").strip("'")
DBUSER = config.get("DATABASE", "USER").strip("'")
DBPASSWORD = config.get("DATABASE", "PASSWORD").strip("'")
DBHOST = config.get("DATABASE", "HOST").strip("'")

def save_db_tables_to_parquet(cursor, file_paths):
    for table_name, file_path in file_paths.items():
        # Извлечение данных из таблицы
        query = f"SELECT * FROM {table_name}"
        cursor.execute(query)
        # Получаем названия столбцов
        columns = [desc[0] for desc in cursor.description]
        data = cursor.fetchall()

        # Преобразование в DataFrame
        df = pd.DataFrame(data, columns=columns)

        # Преобразование сложных типов данных в строки JSON
        for col in df.columns:
            if isinstance(df[col].iloc[0], dict) or isinstance(df[col].iloc[0], list):
                df[col] = df[col].apply(lambda x: json.dumps(x) if not pd.isnull(x) else x)

        # Проверка наличия папки для сохранения файла
        folder_path = os.path.dirname(file_path)
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)

        # Сохранение в файл parquet
        df.to_parquet(file_path, index=False)

def export2parquet():
    # Connect to PostgreSQL database
    conn = psycopg2.connect(dbname=DBNAME, user=DBUSER, password=DBPASSWORD, host=DBHOST)
    cursor = conn.cursor()

    # Чтение словаря таблиц и путей к файлам Parquet из JSON файла
    with open('tables_and_paths.json', 'r') as file:
        file_paths = json.load(file)

    save_db_tables_to_parquet(cursor, file_paths)

    conn.commit()
    cursor.close()
    conn.close()

if __name__ == "__main__":
    export2parquet()
